package com.gmgx.dao;

import com.gmgx.entity.Teacher;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface ITeacherDao {
    @Select("select tno,tname,sex from t_teacher")
    List<Teacher> queryAllTeacher();

    @Select("select tno,tname,sex from t_teacher where tno=#{tno}")
    Teacher queryTeacherByTno(int tno);

    @Insert("insert into t_teacher(tname,sex)values(#{tname},#{sex})")
    boolean addTeacher(Teacher teacher);

    @Delete("delete from t_teacher where tno=#{tno}")
    boolean deleteTeacher(Integer tno);

    @Update("update t_teacher set tname=#{tname} where tno=#{tno}")
    boolean modifyTeacher(@Param("tno") Integer tno, @Param("tname") String tname);

    @Select("select tno,tname,sex from t_teacher where tno=#{tno}")
    @Results({
            @Result(id = true,property = "tno", column = "tno"),
            @Result(property = "tname", column = "tname"),
            @Result(property = "sex", column = "sex"),
            @Result(property = "myStuList", column = "tno", //javaType = List.class
                    many = @Many(select = "com.gmgx.dao.IStudentDao2.queryStudentByTno"))
    })
    Teacher queryTeacherAndStudentsByTno(Integer tno);


    @Select(" select tno,tname,sex,cno mycno  from t_teacher where tno  =#{tno}  ")
    @Results({
            @Result(id = true,property = "tno",column = "tno"),// 主键:(一定要写)，其他键如果列名和属性名一致，可以不写
            @Result(property = "myClassroom" ,column = "mycno",// javaType = Classroom.class,可以省略
                    one = @One(select = "com.gmgx.dao.IClassroomDao.queryClassroomByCno")// 一对一的配置
            )

    })
    Teacher queryTeacherAndClassroomByTno(Integer tno);


    /*
     *
     * 使用  注解版本的配置 一对多 和  一对一
     * 1 使用 有 mybatis维护的 关联关系（一个主（表）查询  配合 另外一个 方法 从（表）查询  ）
     * 2 配置 @Results 相对繁琐一些 ，注意 引号 逗号 括号 等等 以及 是否写错单词。。。
     * 3 一对多 @Many  一对一  @One
     * 4 缺点：每个方法对应一个结果映射， 结果映射 不能被复用 ，所以 因为 列名和属性名不一致，建议使用 别名的方式
     *5  缺点：写动态sql语句 或复杂的查询 ，需要注意 各种 引号 和 + 配合使用（把他当做 字符串 但是又要注意格式）
     * 作业：
     * 将 昨天的作业：通过注解的方式实现（尽量用）
     * 预习 Spring
     *  */
}
